Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit eed826dce09b9bb0fbbead0932b9edc9f064fb48


Parents : e3f945a
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-11-24T12:09:23+01:00

Added separate busy and rejected callbacks to telephony primitive

Changes

1 files changed, 28 insertions(+), 9 deletions(-)


Diff

diff --git a/LXST/Primitives/Telephony.py b/LXST/Primitives/Telephony.py
index 9726a37..b3ab536 100644
--- a/LXST/Primitives/Telephony.py
+++ b/LXST/Primitives/Telephony.py
@@ -155,6 +155,8 @@ class Telephone(SignallingReceiver):
self.__ringing_callback = None
self.__established_callback = None
self.__ended_callback = None
+ self.__busy_callback = None
+ self.__rejected_callback = None
self.target_frame_time_ms = None
self.audio_output = None
self.audio_input = None
@@ -218,6 +220,14 @@ class Telephone(SignallingReceiver):
if not callable(callback): raise TypeError(f"Invalid callback, {callback} is not callable")
self.__ended_callback = callback
+ def set_busy_callback(self, callback):
+ if not callable(callback): raise TypeError(f"Invalid callback, {callback} is not callable")
+ self.__busy_callback = callback
+
+ def set_rejected_callback(self, callback):
+ if not callable(callback): raise TypeError(f"Invalid callback, {callback} is not callable")
+ self.__rejected_callback = callback
+
def set_speaker(self, device):
self.speaker_device = device
RNS.log(f"{self} speaker device set to {device}", RNS.LOG_DEBUG)
@@ -386,7 +396,7 @@ class Telephone(SignallingReceiver):
if self.low_latency_output: self.audio_output.enable_low_latency()
return True
- def hangup(self):
+ def hangup(self, reason=None):
if self.active_call:
with self.call_handler_lock:
terminating_call = self.active_call; self.active_call = None
@@ -408,7 +418,14 @@ class Telephone(SignallingReceiver):
if remote_identity: RNS.log(f"Call with {RNS.prettyhexrep(remote_identity.hash)} terminated", RNS.LOG_DEBUG)
else: RNS.log(f"Outgoing call could not be connected, link establishment failed", RNS.LOG_DEBUG)
- if callable(self.__ended_callback): self.__ended_callback(remote_identity)
+ if reason == None:
+ if callable(self.__ended_callback): self.__ended_callback(remote_identity)
+ elif reason == Signalling.STATUS_BUSY:
+ if callable(self.__busy_callback): self.__busy_callback(remote_identity)
+ elif callable(self.__ended_callback): self.__ended_callback(remote_identity)
+ elif reason == Signalling.STATUS_REJECTED:
+ if callable(self.__rejected_callback): self.__rejected_callback(remote_identity)
+ elif callable(self.__ended_callback): self.__ended_callback(remote_identity)
def mute_receive(self, mute=True):
if self.receive_mixer: self.receive_mixer.mute(mute)
@@ -432,11 +449,13 @@ class Telephone(SignallingReceiver):
def switch_profile(self, profile=None, from_signalling=False):
if self.active_call:
- self.active_call.profile = profile
- self.transmit_codec = Profiles.get_codec(self.active_call.profile)
- self.target_frame_time_ms = Profiles.get_frame_time(self.active_call.profile)
- if not from_signalling: self.signal(Signalling.PREFERRED_PROFILE+self.active_call.profile, self.active_call)
- self.__reconfigure_transmit_pipeline()
+ if self.active_call.profile == profile: return
+ else:
+ self.active_call.profile = profile
+ self.transmit_codec = Profiles.get_codec(self.active_call.profile)
+ self.target_frame_time_ms = Profiles.get_frame_time(self.active_call.profile)
+ if not from_signalling: self.signal(Signalling.PREFERRED_PROFILE+self.active_call.profile, self.active_call)
+ self.__reconfigure_transmit_pipeline()
def __select_call_profile(self, profile=None):
if profile == None: profile = Profiles.DEFAULT_PROFILE
@@ -621,12 +640,12 @@ class Telephone(SignallingReceiver):
self.active_call.is_terminating = True
self.__play_busy_tone()
self.__disable_dial_tone()
- self.hangup()
+ self.hangup(reason=Signalling.STATUS_BUSY)
elif signal == Signalling.STATUS_REJECTED:
RNS.log("Remote rejected call, terminating", RNS.LOG_DEBUG)
self.__play_busy_tone()
self.__disable_dial_tone()
- self.hangup()
+ self.hangup(reason=Signalling.STATUS_REJECTED)
elif signal == Signalling.STATUS_AVAILABLE:
RNS.log("Line available, sending identification", RNS.LOG_DEBUG)
self.call_status = signal


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────